/**
 * Created by PanJiaChen on 16/11/18.
 */

/**
 * Parse the time to string
 * @param {(Object|string|number)} time
 * @param {string} cFormat //格式化目标字符串
 * @returns {string | null}
 */
export function parseTime (time, cFormat) {
  if (arguments.length === 0 || !time) {
    return null
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
  let date // 保存日期的对象
  if (typeof time === 'object') {
    date = time
  } else {
    if (typeof time === 'string') {
      // 如果time时间是字符串
      if (/^[0-9]+$/.test(time)) {
        // 只能由0-9的数字组成(+ 可匹配一次或更多次)
        // support "1548221490638" (毫秒字符串)
        // 把毫秒字符串格式化成数字
        time = parseInt(time)
      } else {
        // support safari(支持IOS内在的浏览器,时间字符串只能用/,不能-)
        // https://stackoverflow.com/questions/4310953/invalid-date-in-safari
        // 字符串.replace() 替换方法,把参数1匹配的,直接换成2,并返回新的字符串
        // g全局匹配,可以匹配多次,不然只能替换1个-
        // m多行匹配,如果字符串里包含回车多行,也能匹配到
        time = time.replace(new RegExp(/-/gm), '/')
        // 处理后'2020/10/01'
      }
    }
    // 如果是数字,并且长度是10位(传经来的是秒),但new Date()里要求传入的是毫秒
    if (typeof time === 'number' && time.toString().length === 10) {
      time = time * 1000 // 转成毫秒
    }
    date = new Date(time)
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }

  // 要把占位符替换,用了replace()方法
  // 正则:先匹配左右两侧必须是{},接着匹配{}中间为([ymdhisa]) +任意一个一次到多次
  // replace() 参数2,可以直接是因为替换的值,也可以是一个回调函数,用函数return值来进行替换
  const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
    // result 匹配到的字符串,(例如:{y},{m}...)
    // key 匹配到的()正则里的东西,(例如:y,m,...)

    const value = formatObj[key] // 换对应位置值
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value] // 如果key为'a'
      // 用0-6数字作为下标,换出中文字符,返回format里面{a}的位置替换成中文周几
    }
    return value.toString().padStart(2, '0')
    // 字符串.padStart()就是字符串不够参数1指定位数,
  })
  return time_str
}

/**
 * @param {number} time 传入必须是数字(时间戳)
 * @param {string} option 格式化占位符
 * @returns {string}
 */
export function formatTime (time, option) {
  if (('' + time).length === 10) {
    time = parseInt(time) * 1000 // 传入是秒转毫秒
  } else {
    time = +time // 类型转数字
  }
  const d = new Date(time) // 时间戳变日期对象
  const now = Date.now() // 当前系统时间的时间戳(毫秒)

  const diff = (now - d) / 1000 // 可以用时间戳-日期对象(返回时间戳差值毫秒)/1000
  // diff 当前时间和传入目标时间.过了多少秒
  if (diff < 30) {
    return '刚刚'
  } else if (diff < 3600) {
    // 一小时内,返回xx分钟前
    // less 1 hour
    // Math.ceil() 向上取值
    // Math.floor() 向下取值
    // Math.rand() 四舍五入
    return Math.ceil(diff / 60) + '分钟前'
  } else if (diff < 3600 * 24) {
    // 一天内返回xx小时前
    return Math.ceil(diff / 3600) + '小时前'
  } else if (diff < 3600 * 24 * 2) {
    // 2天前,直接返回一天前
    return '1天前'
  }
  if (option) {
    return parseTime(time, option) // 超过1天前,如果传入了格式化占位符,就调用上面面的方法
  } else {
    return (
      d.getMonth() +
      1 +
      '月' +
      d.getDate() +
      '日' +
      d.getHours() +
      '时' +
      d.getMinutes() +
      '分'
    )
  }
}

/**
 * @param {string} url
 * @returns {Object}
 */
export function param2Obj (url) {
  // decodeURIComponent() 内置的,把url编码转回原来的样子
  // URL编码:例如:
  const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
  if (!search) {
    return {} // url上没有?后面参数,直接返回空对象
  }

  // 如果有参数字符串↓
  // 例如: search: 'name=李四&age=18'
  const obj = {}
  const searchArr = search.split('&') // ['name=李四','age=18']
  searchArr.forEach(v => {
    // v就是数组里每一项
    const index = v.indexOf('=') // 查找=字符下标
    if (index !== -1) {
      // index找到了
      const name = v.substring(0, index) // substring截取
      const val = v.substring(index + 1, v.length)
      obj[name] = val
    }
  })
  return obj
}

/**
 * 将excel的日期格式转成Date()对象
 * @param {*} serial 
 * @returns 
 */
export function getFormatDate_XLSX(serial) {
  var utc_days = Math.floor(serial - 25569);
  var utc_value = utc_days * 86400;
  var date_info = new Date(utc_value * 1000);
  var fractional_day = serial - Math.floor(serial) + 0.0000001;
  var total_seconds = Math.floor(86400 * fractional_day);
  var seconds = total_seconds % 60;
  total_seconds -= seconds;
  var hours = Math.floor(total_seconds / (60 * 60));
  var minutes = Math.floor(total_seconds / 60) % 60;
  var d = new Date(date_info.getFullYear(), date_info.getMonth(), date_info.getDate(), hours, minutes, seconds);
  /*//得到Date()对象后，便可进行日期格式化了！
  var add0 = (m) => m < 10 ? '0' + m : m;
  var d = getFormatDate_XLSX(44358.9999884259);
  var YYYY = d.getFullYear();
  var MM = add0(d.getMonth() + 1);
  var DD = add0(d.getDate());
  var hh = add0(d.getHours());
  var mm = add0(d.getMinutes());
  var ss = add0(d.getSeconds());
  return `${YYYY}-${MM}-${DD} ${hh}:${mm}:${ss}`;
  */
  return d;
}

/**
 * 计算两次以上的数组,复购率分子
 * @param {*} array 
 * @returns 
 */
export function findovertwo(array) {
  // debugger
  const setArr = {}
  for (let i = 0; i < array.length; i++) {
      setArr[array[i]] == undefined ? setArr[array[i]] = 1 : setArr[array[i]]++
  }
  const a1 = Object.values(setArr).filter(i => i >= 2)
  return a1.length
}

/**
 * 计算两个时间戳之间每天零点的时间戳的方法
 * @param {*} start_time 
 * @param {*} end_time 
 * @returns 
 */
export function getZeroTimeStamps(start, end) {
  const result = [];
  let date = new Date(start * 1000);
  date.setHours(0, 0, 0, 0);
  while (date.getTime() <= end * 1000) {
    const year = date.getFullYear();
    const month = date.getMonth();
    const day = date.getDate();
    result.push(new Date(year, month, day).getTime() / 1000);
    date.setDate(date.getDate() + 1);
  }
  return result;
}

export function timestampToDateTimeString(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0');
  const dateTimeString = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
  return dateTimeString;
}

export function timeChangeStr(timestamp) {
  const timestampRegex = /^\d+(\.\d+)?$/;
  // const data = "45056.3685532407";
  const isStrMoney = timestampRegex.test(timestamp)
  if (isStrMoney) {
    // 将序列号的整数部分解释为日期
    const datePart = new Date((timestamp - 25569) * 86400 * 1000);
    
    // 将序列号的小数部分解释为时间
    const timePart = new Date(datePart.getUTCFullYear(), datePart.getUTCMonth(), datePart.getUTCDate(), 0, 0, 0);
    const milliseconds = Math.round((timestamp % 1) * 86400 * 1000);
    timePart.setMilliseconds(milliseconds);
    console.log(237, timestampToDateTimeString(timePart.getTime()));
    return timestampToDateTimeString(timePart.getTime())
  }else {
    return timestampToDateTimeString(timestamp)
  }
}